package org.littlewings.hazelcast.partitions;
import java.io.Console;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Supplier;
import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.core.Partition;
import com.hazelcast.core.PartitionService;
import com.hazelcast.instance.HazelcastInstanceProxy;
import com.hazelcast.nio.serialization.Data;
import com.hazelcast.nio.serialization.SerializationService;
import com.hazelcast.partition.strategy.StringPartitioningStrategy;
public abstract class HazelcastInterpreterSupport {
protected void withHazelcast(Consumer<HazelcastInstance> consumer) {
HazelcastInstance hazelcast = Hazelcast.newHazelcastInstance();
try {
logging("Hazelcast startup.");
consumer.accept(hazelcast);
} finally {
hazelcast.getLifecycleService().shutdown();
Hazelcast.shutdownAll();
logging("Hazelcast shutdown.");
}
}
protected abstract void execute(String... args);
protected void readConsoleWhile(HazelcastInstance hazelcast, String name, Supplier<Void> showAll, Supplier<Integer> counter) {
Console console = System.console();
String line;
while ((line = console.readLine("> ")) != null) {
if (line.isEmpty()) {
continue;
}
String[] tokens = line.split("\\s+", -1);
String command = tokens[0];
boolean stop = false;
switch (command) {
case "all":
showAll.get();
break;
case "locate":
if (tokens.length > 1) {
String key = tokens[1];
Partition partition = hazelcast.getPartitionService().getPartition(key);
show("Locate key = %s, partitionId = %s, owner = %s.", key, partition.getPartitionId(), partition.getOwner());
} else {
show("Locate, required key.");
}
break;
case "self":
show("Self = %s.", hazelcast.getCluster().getLocalMember());
break;
case "name":
PartitionService partitionService = hazelcast.getPartitionService();
SerializationService serializationService = ((HazelcastInstanceProxy)hazelcast).getSerializationService();
Data key = serializationService.toData(name, StringPartitioningStrategy.INSTANCE);
Partition partition = partitionService.getPartition(key);
show("Partition by name = %s, partitionId = %s, owner = %s.", name, partition.getPartitionId(), partition.getOwner());
break;
case "size":
show("This data set size = %d.", counter.get());
break;
case "exit":
stop = true;
break;
default:
show("Unknown command = %s.", command);
break;
}
if (stop) {
break;
}
}
}
protected void logging(String format, Object... args) {
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
System.out.println("[" + formatter.format(now) + "] " + String.format(format, args));
}
protected void show(String format, Object... args) {
System.out.println(String.format(format, args));
}
}